package com.example.springboot.controller.requstParams;

import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 参数处理流程：
 * 1 handlerMapping找到能处理的handler,具体哪个类的方法（Controller*method）
 * 2 为当前handler找到一个handlerAdapter(一般是RequestMappingHandlerAdapter)
 * 3 适配器执行目标方法（包装目标方法）
 *  ① 设置参数解析器（springmvc能写多少种参数类型，取决于参数解析器的个数）
 *  ② 设置返回值处理器（默认15个）
 *  ③ 执行目标方法invokeForRequest(
 *      ① 获取方法的参数值（
 *          ① 先挨个判断默认的26个参数解析器（HandlerMethodArgumentResolver.support）是否能支持该参数类型
 *          ② 拿到参数解析通过各种方式（不同解析器的解析方式不同）获取对应参数的值
 *      ）
 *  )
 *  注： HttpServletRequest参数的参数解析器是ServletRequestMethodArgumentResolver
 *  判断条件：
 *   public boolean supportsParameter(MethodParameter parameter) {
 *         Class<?> paramType = parameter.getParameterType();
 *         return WebRequest.class.isAssignableFrom(paramType) || ServletRequest.class.isAssignableFrom(paramType)
 *         || MultipartRequest.class.isAssignableFrom(paramType) || HttpSession.class.isAssignableFrom(paramType)
 *         || pushBuilder != null && pushBuilder.isAssignableFrom(paramType) || Principal.class.isAssignableFrom(paramType)
 *         || InputStream.class.isAssignableFrom(paramType) || Reader.class.isAssignableFrom(paramType) || HttpMethod.class == paramType
 *         || Locale.class == paramType || TimeZone.class == paramType || ZoneId.class == paramType;
 *     }
 * @Author:ChenZhangKun
 * @Date: 2021/6/8 22:38
 */
@RestController
@RequestMapping("/params")
public class RequestParamsController {
    /**
     * 获取单个请求头
     *
     * @param userAgent
     * @return
     */
    @GetMapping("/header")
    public Map<String, Object> header(@RequestHeader("User-Agent") String userAgent) {
        Map<String, Object> map = new HashMap<>(16);
        map.put("user-agent", userAgent);
        return map;
    }

    /**
     * 获取全部请求头
     *
     * @param map
     * @return
     */
    @GetMapping("/allHeader")
    public Map<String, Object> header_1(@RequestHeader Map<String, Object> map) {
        return map;
    }

    /**
     * 获取单个参数的集合
     *
     * @param name
     * @return
     */
    @GetMapping("/test3")
    public List<String> getAllParams(@RequestParam("name") List<String> name) {
        return name;
    }

    /**
     * 将参数放入map结合中
     *
     * @param map
     * @return
     */
    @GetMapping("/test4")
    public Map<String, Object> getMapAllParams(@RequestParam Map<String, Object> map) {
        return map;
    }

}
